package com.t.bricks.bussiness.controller.orders;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.t.bricks.bussiness.db.entity.orders.Orders;
import com.t.bricks.bussiness.model.orders.ConditionOrders;
import com.t.bricks.bussiness.service.orders.OrdersService;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.utils.function.data.SequenceUtil;
import com.t.bricks.utils.modules.web.FindByPageParam;

@RestController
@Api(value="订单", tags={"仓储管理-订单操作接口"})
@RequestMapping("/orders/")
public class OrdersController {

	/**
	 * 订单业务实现类
	 */
	@Autowired
	private OrdersService ordersService;

	/**
	 * 删除数据
	 * @param iVersion
	 * @param sId 记录编号
	 * @return MsgEmity
	 */
	//[start]
	@ApiOperation(value="删除数据")
	@ApiImplicitParams({
		@ApiImplicitParam(name="iVersion", value="数据版本号", dataType="Integer", paramType="query", required=true),
		@ApiImplicitParam(name="sId", value="记录编号", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="编号参数为空或不符合值"),
		@ApiResponse(code=8002, message="信息版本参数为空或不符合值"),
		@ApiResponse(code=7001, message="删除数据失败，系统中的数据可能已经被更新"),
		@ApiResponse(code=7002, message="删除数据失败，删除未能得到预期影响值"),
		@ApiResponse(code=7003, message="删除时发生异常"),
		@ApiResponse(code=7004, message="7004~7998、8003~8998为删除时发生的其它错误"),
		@ApiResponse(code=7999, message="删除成功")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/del")
	public MsgEmity del(Integer iVersion, String sId) {
		return ordersService.del(iVersion, sId);
	}

	/**
	 * 新增数据
	 * @param orders 订单实体对象
	 * @return MsgEmity
	 */
	//[start]
	@ApiOperation(value="新增数据", response=Orders.class)
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|Json数据对象}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8000, message="请求操作的参数为空"),
		@ApiResponse(code=8001, message="内部待转换的类型为空"),
		@ApiResponse(code=8002, message="服务端缺少json转换包的引用"),
		@ApiResponse(code=8003, message="服务端缺少json转换包的引用"),
		@ApiResponse(code=8004, message="待操作的数据不符合格式要求"),
		@ApiResponse(code=8011, message="检查数据时:待存储的数据实体不能为null"),
		@ApiResponse(code=8101, message="检查数据时:数据为null"),
		@ApiResponse(code=8102, message="检查数据时:数据某个值超出最大长度限制"),
		@ApiResponse(code=8103, message="检查数据时:数据某个值为空"),
		@ApiResponse(code=8021, message="验证数据是否重复时:待存储的数据实体不能为null"),
		@ApiResponse(code=8022, message="验证数据是否重复时:没有找到对应的dao实例,请检查代码规范"),
		@ApiResponse(code=8023, message="验证数据是否重复时:无法调用checkRepeatByAdd且发生了异常"),
		@ApiResponse(code=8024, message="验证数据是否重复时:检查数据是否重复失败"),
		@ApiResponse(code=8025, message="验证数据是否重复时:代码错误,checkRepeatByAdd方法返回的结构不是MsgEmity"),
		@ApiResponse(code=8026, message="验证数据是否重复时:数据重复"),
		@ApiResponse(code=8028, message="验证数据是否重复时:检查数据是否重复失败"),
		@ApiResponse(code=8311, message="补充数据时:待存储的数据实体不能为null"),
		@ApiResponse(code=8312, message="补充数据时:设置默认值失败"),
		@ApiResponse(code=7001, message="新增数据失败"),
		@ApiResponse(code=7002, message="新增时发生异常"),
		@ApiResponse(code=7003, message="7003~8998为新增时发生的其它错误")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/add")
	public MsgEmity add(@RequestBody Orders orders) {
		return ordersService.add(orders);
	}

//	/**
//	 * 修改数据
//	 * @param orders 订单实体对象
//	 * @return MsgEmity
//	 */
//	//[start]
//	@ApiOperation(value="修改数据", response=Orders.class)
//	@ApiResponses({
//		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|Json数据对象}"),
//		@ApiResponse(code=400, message="错误的请求,请检查路径"),
//		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
//		@ApiResponse(code=1000001, message="内部请求密钥错误"),
//		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
//		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
//		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
//		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
//		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
//		@ApiResponse(code=8000, message="请求操作的参数为空"),
//		@ApiResponse(code=8001, message="内部待转换的类型为空"),
//		@ApiResponse(code=8002, message="服务端缺少json转换包的引用"),
//		@ApiResponse(code=8003, message="服务端缺少json转换包的引用"),
//		@ApiResponse(code=8004, message="待操作的数据不符合格式要求"),
//		@ApiResponse(code=8011, message="检查数据时:待存储的数据实体不能为null"),
//		@ApiResponse(code=8012, message="检查数据时:待存储的数据实体信息版本号为空"),
//		@ApiResponse(code=8013, message="检查数据时:待存储的数据实体信息版本号小于1"),
//		@ApiResponse(code=8014, message="检查数据时:待存储的数据实体定义不能为null"),
//		@ApiResponse(code=8015, message="检查数据时:待存储的数据实体定义中缺乏'isKey'的DataInfo注解"),
//		@ApiResponse(code=8016, message="检查数据时:信息编号不能为空"),
//		@ApiResponse(code=8101, message="检查数据时:数据为null"),
//		@ApiResponse(code=8102, message="检查数据时:数据某个值超出最大长度限制"),
//		@ApiResponse(code=8103, message="检查数据时:数据某个值为空"),
//		@ApiResponse(code=8021, message="验证数据是否重复时:待存储的数据实体不能为null"),
//		@ApiResponse(code=8022, message="验证数据是否重复时:没有找到对应的dao实例,请检查代码规范"),
//		@ApiResponse(code=8023, message="验证数据是否重复时:无法调用checkRepeatByEdit且发生了异常"),
//		@ApiResponse(code=8024, message="验证数据是否重复时:检查数据是否重复失败"),
//		@ApiResponse(code=8025, message="验证数据是否重复时:代码错误,checkRepeatByEdit方法返回的结构不是MsgEmity"),
//		@ApiResponse(code=8026, message="验证数据是否重复时:数据重复"),
//		@ApiResponse(code=8028, message="验证数据是否重复时:检查数据是否重复失败"),
//		@ApiResponse(code=8311, message="补充数据时:待存储的数据实体不能为null"),
//		@ApiResponse(code=7001, message="修改数据失败，数据可能已经被删除"),
//		@ApiResponse(code=7002, message="修改数据失败，系统中的数据可能已经被更新"),
//		@ApiResponse(code=7003, message="修改数据失败，未能得到预期影响值(1)"),
//		@ApiResponse(code=7004, message="修改数据失败，修改操作发生异常"),
//		@ApiResponse(code=7005, message="7005~8998为修改时发生的其它错误")
//	})
//	//[end]
//	@RequestMapping(method={RequestMethod.POST}, value="/edit")
//	public MsgEmity edit(@RequestBody Orders orders) {
//		return ordersService.edit(orders);
//	}

	/**
	 * 根据记录编号取对象
	 * @param sId 记录编号
	 * @return MsgEmity
	 */
	//[start]
	@ApiOperation(value="根据记录编号取对象", response=Orders.class)
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|Json数据对象}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="编号参数能为空"),
		@ApiResponse(code=7001, message="数据不存在"),
		@ApiResponse(code=7002, message="查询发生异常"),
		@ApiResponse(code=7003, message="7003~8998为修改时发生的其它错误")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/find/id")
	public MsgEmity findById(String sId) {
		return ordersService.findById(sId);
	}

	/**
	 * 根据关键值取对象集合
	 * @param orders 订单实体对象
	 * @return MsgEmity
	 */
	//[start]
	@ApiOperation(value="根据关键值取对象集合", response=Orders.class)
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|Json数据对象集合}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8000, message="条件参数不能为空"),
		@ApiResponse(code=8001, message="内部待转换的类型为空"),
		@ApiResponse(code=8002, message="服务端缺少json转换包的引用"),
		@ApiResponse(code=8003, message="服务端缺少json转换包的引用"),
		@ApiResponse(code=8004, message="待操作的数据不符合格式要求"),
		@ApiResponse(code=7001, message="数据不存在"),
		@ApiResponse(code=7002, message="查询发生异常"),
		@ApiResponse(code=7003, message="7003~8998为修改时发生的其它错误")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/find/key")
	public MsgEmity findByKey(@RequestBody Orders orders) {
		return ordersService.findByKey(orders);
	}

	/**
	 * 根据记录编号查询符合分页数据的某条记录
	 * @param sId 记录编号
	 * @return MsgEmity
	 */
	//[start]
	@ApiOperation(value="根据记录编号查询符合分页数据的某条记录", response=Orders.class)
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|Json数据对象}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="编号参数能为空"),
		@ApiResponse(code=7001, message="数据不存在"),
		@ApiResponse(code=7002, message="查询发生异常"),
		@ApiResponse(code=7003, message="7003~8998为修改时发生的其它错误")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/find/page/row")
	public MsgEmity findByPageRow(String sId) {
		return ordersService.findByPageRow(sId);
	}

	/**
	 * 查询分页数据
	 * @param findByPageParam 分页查询条件组合类
	 * 结构参考: {"page": 分页请求信息对象, "orders": 排序信息对象集合, "sLikeStr": 全文检索, "condition": 查询条件对象}
	 * @return MsgEmity 返回查询结果
	 */
	//[start]
	@ApiOperation(value="查询分页数据", response=Orders.class)
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|Json数据对象集合}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=7001, message="查询数量失败且发生异常"),
		@ApiResponse(code=7002, message="查询数据发生异常，值为null"),
		@ApiResponse(code=7003, message="查询分页数据发生异常"),
		@ApiResponse(code=7004, message="7004~8998为修改时发生的其它错误")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/find/page")
	public MsgEmity findByPage(@RequestBody FindByPageParam<ConditionOrders> findByPageParam) {
		return ordersService.findByPage(findByPageParam.getPage(),
				findByPageParam.getOrders(),
				findByPageParam.getsLikeStr(),
				findByPageParam.getCondition());
	}
	
	/**
	 * 创建Excel文件
	 * @param findByPageParam 分页查询条件组合类,注意:分页信息将被抛弃
	 * 结构参考:  {"page": 分页请求信息对象(被抛弃), "orders": 排序信息对象集合, "sLikeStr": 全文检索, "condition": 查询条件对象}
	 * @return MsgEmity 返回结构中data为创建的经过压缩的Excel内容,接收端需要进行解压,msg为文件名
	 */
	//[start]
	@ApiOperation(value="创建Excel文件", notes="返回结构中data为创建的经过压缩的Excel内容,接收端需要进行解压,msg为文件名")
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": Excel内容}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=6001, message="没有指定模板"),
		@ApiResponse(code=6002, message="没有指定保存位置"),
		@ApiResponse(code=6003, message="保存路径错误"),
		@ApiResponse(code=6004, message="没有数据可导出"),
		@ApiResponse(code=6005, message="读取模板文件失败"),
		@ApiResponse(code=6006, message="保存文件时失败"),
		@ApiResponse(code=6100, message="待压缩字符串为空(文件内容为空)"),
		@ApiResponse(code=6101, message="压缩时发生异常"),
		@ApiResponse(code=7001, message="查询数据发生异常,执行的返回值为:null,预期值不应为null"),
		@ApiResponse(code=7002, message="查询导出文件用的数据发生异常"),
		@ApiResponse(code=7003, message="7003~8998为修改时发生的其它错误")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/export")
	public MsgEmity export(@RequestBody FindByPageParam<ConditionOrders> findByPageParam) {
		return ordersService.export(
				findByPageParam.getOrders(),
				findByPageParam.getsLikeStr(),
				findByPageParam.getCondition());
	}

	/**
	 * 修改状态
	 * @param orders
	 * @return MsgEmity 返回执行情况
	 */
	//[start]
	@ApiOperation(value="修改状态", notes="状态值不可逆修改", response=Orders.class)
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": Excel内容}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="编号为空"),
		@ApiResponse(code=8002, message="状态值为空"),
		@ApiResponse(code=8003, message="版本号小于1"),
		@ApiResponse(code=8004, message="修改订单状态成功,但添加快递单失败"),
		@ApiResponse(code=7001, message="没有找到对应数据"),
		@ApiResponse(code=7002, message="更新状态失败，系统中的数据可能已经被更新"),
		@ApiResponse(code=7003, message="更新状态失败，状态禁止逆操作"),
		@ApiResponse(code=7004, message="更新状态未能得到预期影响值(预期1)"),
		@ApiResponse(code=7005, message="更新状态时发生异常"),
		@ApiResponse(code=7006, message="7006~8998为修改时发生的其它错误")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/change/state")
	public MsgEmity changeState(@RequestBody Orders orders) {
		return ordersService.changeState(orders);
	}

	//---------------------------- 自动生成代码结束 ----------------------------//
	
	/**
	 * 直接调用Mapping中方法参考
	 * 注意:1)本方法仅用于参考,不能开放,保留这段屏蔽的代码仅为了方便接口的扩展
	 *	 2)本方法的函数名必须与Mapping中的方法名一致
	 *	 3)本方法的参数必须与Mapping中的参数类型和顺序一致
	 * @param 参数
	 * @return MsgEmity 返回查询结果
	 */
	//@ApiOperation(value="接口名称", notes="接口描述", response=接口返回的MsgEmity中的Data类名.class)
	//@ApiResponses({
	//	@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|Json字符串}"),
	//	@ApiResponse(code=400, message="错误的请求,请检查路径"),
	//	@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
	//	@ApiResponse(code=1000001, message="内部请求密钥错误"),
	//	@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
	//	@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
	//	@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
	//	@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
	//	@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
	//	@ApiResponse(code=7001, message="码值代表的信息"),
	//	@ApiResponse(code=7002, message="码值代表的信息"),
	//	@ApiResponse(code=7003, message="码值代表的信息"),
	//	@ApiResponse(code=7004, message="码值代表的信息")
	//})
	//@RequestMapping(method={RequestMethod.POST}, value="/callMapping")
	//public MsgEmity 与mapping中的方法名一致(Integer i, String s, @RequestBody Object o...) {
	//	return ordersService.callMapping(i, s, o...);//controller中的参数有多少个,这里的参数就有多少个
	//}
	
	/**
	 * 取流水号
	 * @return MsgEmity
	 */
	//[start]
	@ApiOperation(value="取流水号")
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 流水号}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/sequence")
	public MsgEmity getSequence() {
		return new MsgEmity(true, "获取成功", SequenceUtil.getSequence());
	}
	
}
